package boundary;

import java.awt.GridBagLayout;
import javax.swing.DefaultListModel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JPopupMenu;
import java.awt.GridBagConstraints;
import java.awt.Font;
import javax.swing.JList;
import javax.swing.JButton;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import dataview.Passi;
import dataview.Ricette;
import exceptions.DBException;
import exceptions.NomeGiaInUso;
import store.BaseStore;
import store.Passo;
import store.Ricetta;
import store.TutteRicette;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JScrollPane;
import javax.swing.BorderFactory;
import javax.swing.border.BevelBorder;

public class ListaPassi extends JPanel implements ActionListener {
	
	private static final long serialVersionUID = 1L;
	private Ricetta ricetta;
	private Home home;
	private Passi passi; //  @jve:decl-index=0:
	private JPopupMenu menu; //  @jve:decl-index=0:
	private JMenuItem prima, dopo;
	private JLabel jLabel = null;
	private JList jList = null;
	private DefaultListModel model = null;
	private JButton aggiungiB = null;
	private JButton eliminaB = null;
	private JButton modificaB = null;
	private JButton confermaB = null;
	private boolean modifica;
	private JScrollPane jScrollPane = null;
	
	/**
	 * This is the default constructor
	 */
	public ListaPassi(Home home, Ricetta ricetta) {
		super();
		this.home = home;
		this.ricetta = ricetta;
		initialize();
	}
	
	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		GridBagConstraints gridBagConstraints51 = new GridBagConstraints();
		gridBagConstraints51.fill = GridBagConstraints.BOTH;
		gridBagConstraints51.weighty = 1.0;
		gridBagConstraints51.gridx = 0;
		gridBagConstraints51.gridy = 1;
		gridBagConstraints51.gridwidth = 4;
		gridBagConstraints51.insets = new Insets(5, 5, 5, 5);
		gridBagConstraints51.weightx = 1.0;
		GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
		gridBagConstraints5.gridx = 3;
		gridBagConstraints5.insets = new Insets(5, 5, 5, 5);
		gridBagConstraints5.anchor = GridBagConstraints.WEST;
		gridBagConstraints5.gridy = 2;
		GridBagConstraints gridBagConstraints21 = new GridBagConstraints();
		gridBagConstraints21.gridx = 2;
		gridBagConstraints21.insets = new Insets(5, 5, 5, 5);
		gridBagConstraints21.gridy = 2;
		GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
		gridBagConstraints11.gridx = 1;
		gridBagConstraints11.insets = new Insets(5, 5, 5, 5);
		gridBagConstraints11.gridy = 2;
		GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
		gridBagConstraints2.gridx = 0;
		gridBagConstraints2.insets = new Insets(5, 5, 5, 5);
		gridBagConstraints2.gridy = 2;
		GridBagConstraints gridBagConstraints = new GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridwidth = 4;
		gridBagConstraints.insets = new Insets(5, 5, 5, 5);
		gridBagConstraints.gridy = 0;
		jLabel = new JLabel();
		jLabel.setText("Procedimento di \"" + ricetta + "\"");
		jLabel.setFont(new Font("Dialog", Font.BOLD, 20));
		this.setSize(464, 193);
		this.setLayout(new GridBagLayout());
		this.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		this.add(getJScrollPane(), gridBagConstraints51);
		this.add(jLabel, gridBagConstraints);
		this.add(getAggiungiB(), gridBagConstraints2);
		this.add(getEliminaB(), gridBagConstraints11);
		this.add(getModificaB(), gridBagConstraints21);
		this.add(getConfermaB(), gridBagConstraints5);
		this.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if (menu != null && menu.isVisible()) menu.setVisible(false);
			}
		});
		
		if (ricetta.getProcedimento() != null && !ricetta.getProcedimento().isEmpty()) {
			modifica = true;
			updateModel();
		} else modifica = false;
	}
	
	/**
	 * This method initializes jList
	 * 
	 * @return javax.swing.JList
	 */
	private JList getJList() {
		if (jList == null) {
			updateModel();
			jList = new JList(model);
			jList.addListSelectionListener(new ListSelectionListener() {
				
				@Override
				public void valueChanged(ListSelectionEvent e) {
					eliminaB.setEnabled(jList.getSelectedIndex() >= 0);
					modificaB.setEnabled(jList.getSelectedIndex() >= 0);
				}
			});
		}
		return jList;
	}
	
	private void updateModel() {
		model = new DefaultListModel();
		if (ricetta.getProcedimento() == null)
			passi = new Passi();
		else passi = ricetta.getProcedimento();
		for (Passo p : passi) {
			model.addElement(p);
		}
		getConfermaB().setEnabled(!ricetta.getProcedimento().isEmpty());
	}
	
	/**
	 * This method initializes aggiungiB
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getAggiungiB() {
		if (aggiungiB == null) {
			aggiungiB = new JButton();
			aggiungiB.setText("Aggiungi");
			aggiungiB.setActionCommand("Aggiungi");
			aggiungiB.setIcon(new ImageIcon(getClass().getResource("/icone/add-icon.png")));
			aggiungiB.addActionListener(this);
			aggiungiB.setFont(new Font("Dialog", Font.BOLD, 12));
		}
		return aggiungiB;
	}
	
	/**
	 * This method initializes eliminaB
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getEliminaB() {
		if (eliminaB == null) {
			eliminaB = new JButton();
			eliminaB.setText("Elimina");
			eliminaB.setEnabled(false);
			eliminaB.setActionCommand("Elimina");
			eliminaB.setIcon(new ImageIcon(getClass().getResource("/icone/remove-icon.png")));
			eliminaB.addActionListener(this);
			eliminaB.setFont(new Font("Dialog", Font.BOLD, 12));
		}
		return eliminaB;
	}
	
	public void passaPasso(Passo passo, int pos) {
		ricetta.aggiungiPasso(pos, passo);
		System.out.println("Aggiunto il passo alla ricetta, ridisegnare lista");
		updateModel();
		jList.setModel(model);
	}
	
	public void passoModificato() {
		updateModel();
		jList.setModel(model);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == getAggiungiB()) { // aggiungere un passo
			if (menu == null) {
				menu = new JPopupMenu();
				prima = new JMenuItem("Prima del passo selezionato");
				dopo = new JMenuItem("Dopo il passo selezionato");
				prima.addActionListener(this);
				dopo.addActionListener(this);
				menu.add(prima);
				menu.add(dopo);
				menu.setEnabled(true);
			}
			if (passi.size() > 0) {
				if (getJList().getSelectedIndex() == -1) {
					JOptionPane.showMessageDialog(this, "Selezionare prima un passo per scegliere la posizione in cui inserire il nuovo passo", "Attenzione", JOptionPane.WARNING_MESSAGE);
					return;
				} else {
					menu.setVisible(true);
					menu.setVisible(false);
					menu.show(getAggiungiB(), 0, (int)-menu.getSize().getHeight());
				}
			} else {
				// aggiungi il primo passo
				InserisciUnPasso ip = new InserisciUnPasso(home, this, 0);
				ip.setVisible(true);
			}
		} else if (e.getSource() == prima) {
			// aggiungi il passo al posto di quello selezionato
			InserisciUnPasso ip = new InserisciUnPasso(home, this, jList.getSelectedIndex());
			ip.setVisible(true);
		} else if (e.getSource() == dopo) {
			// aggiungi il passo dopo quello selezionato
			InserisciUnPasso ip = new InserisciUnPasso(home, this, jList.getSelectedIndex() + 1);
			ip.setVisible(true);
		} else if (e.getSource() == getEliminaB()) { // elimina passo
			int res = JOptionPane.showConfirmDialog(this, "Sicuro di voler eliminare il passo?", "Eliminazione passo ricetta", JOptionPane.OK_CANCEL_OPTION);
			if (res == JOptionPane.OK_OPTION) {
				Passo passo = (Passo)jList.getSelectedValue();
				ricetta.eliminaPasso(passo);
				updateModel();
				jList.setModel(model);
			}
		} else if (e.getSource() == getModificaB()) { // modifica passo
			InserisciUnPasso ip = new InserisciUnPasso(home, this, jList.getSelectedIndex(), ricetta.getProcedimento().get(jList.getSelectedIndex()));
			ip.setVisible(true);
		} else if (e.getSource() == getConfermaB()) { // conferma inserimento ricetta
			int res;
			if (BaseStore.isModificato(ricetta)) {
				if (!modifica)
					res = JOptionPane.showConfirmDialog(this, "Confermi la creazione della ricetta?", "Conferma", JOptionPane.OK_CANCEL_OPTION);
				else res = JOptionPane.showConfirmDialog(this, "Confermi la modificazione della ricetta?", "Conferma", JOptionPane.OK_CANCEL_OPTION);
				if (res == JOptionPane.OK_OPTION) {
					try {
						if (!modifica) {
							TutteRicette.getTutteRicette().aggiungi(ricetta);
							JOptionPane.showMessageDialog(this, "Ricetta \"" + ricetta.getNome() + "\" aggiunta correttamente", "Inserimento ricetta", JOptionPane.INFORMATION_MESSAGE);
						} else {
							BaseStore.salvaModifiche(ricetta);
							JOptionPane.showMessageDialog(this, "Ricetta \"" + ricetta.getNome() + "\" modificata", "Modificazione ricetta", JOptionPane.INFORMATION_MESSAGE);
						}
						home.mostraListaRicette(null);
					} catch (DBException e1) {
						e1.printStackTrace();
					} catch (NomeGiaInUso e1) {
						e1.printStackTrace();
					}
				}
			}home.mostraListaRicette(null);
		}
	}
	
	/**
	 * This method initializes modificaB
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getModificaB() {
		if (modificaB == null) {
			modificaB = new JButton();
			modificaB.setText("Modifica");
			modificaB.setIcon(new ImageIcon(getClass().getResource("/icone/comment-edit-icon.png")));
			modificaB.setEnabled(false);
			modificaB.addActionListener(this);
			modificaB.setFont(new Font("Dialog", Font.BOLD, 12));
		}
		return modificaB;
	}
	
	/**
	 * This method initializes confermaB
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getConfermaB() {
		if (confermaB == null) {
			confermaB = new JButton();
			confermaB.setText("Conferma");
			confermaB.addActionListener(this);
			confermaB.setEnabled(!ricetta.getProcedimento().isEmpty());
			confermaB.setIcon(new ImageIcon(getClass().getResource("/icone/accept-icon.png")));
			confermaB.setFont(new Font("Dialog", Font.BOLD, 12));
		}
		return confermaB;
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setViewportView(getJList());
		}
		return jScrollPane;
	}
	
} //  @jve:decl-index=0:visual-constraint="10,10"
